'use strict'

let nunjucks=require('nunjucks');

function createEnv(path,opts){
    opts=opts||{};

    //loader的选项(watch当模板变化时重新加载;noCache不使用缓存，每次都重新编译)
    let loaderOptioons={
        watch:opts.watch||true,
        noCache:opts.noCache||true
    };

    //envirconment的选项(autoescape控制输出是否被转义，throwOnUndefined 当输出为 null 或 undefined 会抛出异常)
    let envOptions={
        autoescape:opts.autoescape||true,
        throwOnUndefined:opts.throwOnUndefined||false
    };

     //env的加载器， 用的是文件系统加载器FileSystemLoader可从文件系统中加载模板
    let loader=new nunjucks.FileSystemLoader(path||'view',loaderOptioons);

    //实例化一个env对象
    let env=new nunjucks.Environment(loader,envOptions);

    //用addFilter添加一个自定义过滤器(filters)
    if(opts.filters){
        for(let i in opts.filters){
            //添加名为 i 的自定义过滤器，opts 为调用的函数
            env.addFilter(i,opts.filters[i]);
        }
    }
    return env;
};

//向外暴露一个函数
module.exports=async(cxt,next)=>{
    //渲染一个函数
    cxt.render=function(view,module){
         //调用createEnv函数
        let env=createEnv();
         //渲染模板和HTML
        cxt.body=env.render(view,module);
    }
    await next();
}